package gui.list_objects;

import gui.del_object.Del_Departement;
import gui.del_object.Del_Pays;
import gui.del_object.Del_Quartier;
import gui.del_object.Del_Region;
import gui.del_object.Del_Ville;
import gui.edit_objects.Edit_Departement;
import gui.edit_objects.Edit_Pays;
import gui.edit_objects.Edit_Quartier;
import gui.edit_objects.Edit_Region;
import gui.edit_objects.Edit_Ville;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import bdd_handler.DepartementDAO;
import bdd_handler.PaysDAO;
import bdd_handler.QuartierDAO;
import bdd_handler.RegionDAO;
import bdd_handler.VilleDAO;
import bdd_handler.bdd;

import objects.Departement;
import objects.Pays;
import objects.Quartier;
import objects.Region;
import objects.Ville;

public class List_Lieux extends JFrame implements ActionListener, ListSelectionListener, ComponentListener{

	private static final long serialVersionUID = 1L;

	private JFrame parent=null;

	private Pays[] liste_pays;
	private Region[] liste_regions;
	private Departement[] liste_departements;
	private Ville[] liste_villes;
	private Quartier[] liste_quartiers;

	private JTable jt_pays, jt_regions, jt_departements, jt_villes, jt_quartiers;
	private JButton new_pays, new_region, new_departement, new_ville, new_quartier, edit_pays, edit_region, edit_departement, edit_ville, edit_quartier, del_pays, del_region, del_departement, del_ville, del_quartier;

	private result_recherche_pays_model pModel;
	private result_recherche_region_model rModel;
	private result_recherche_departement_model dModel;
	private result_recherche_ville_model vModel;
	private result_recherche_quartier_model qModel;

	private PaysDAO pDAO;
	private RegionDAO rDAO;
	private DepartementDAO dDAO;
	private VilleDAO vDAO;
	private QuartierDAO qDAO;

	public List_Lieux(JFrame parent){
		this.addComponentListener(this);
		//recuperation de la fenetre parente
		this.parent=parent;
		this.parent.setVisible(false);

		//construction de la fenetre
		this.setTitle("Lieux");
		this.setSize(1020,650);
		this.setResizable(false);
		JPanel pan=new JPanel();
		pan.setLayout(null);
		this.setContentPane(pan);

		//creation des DAOs
		bdd db=new bdd();
		pDAO=new PaysDAO(db.getConnection());
		rDAO=new RegionDAO(db.getConnection());
		dDAO=new DepartementDAO(db.getConnection());
		vDAO=new VilleDAO(db.getConnection());
		qDAO=new QuartierDAO(db.getConnection());

		//creation objets internes
		liste_pays=pDAO.findAll();
		pModel=new result_recherche_pays_model(liste_pays);
		jt_pays=new JTable(pModel);
		jt_pays.getTableHeader().setReorderingAllowed(false);
		jt_pays.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		jt_pays.getSelectionModel().addListSelectionListener(this);
		rModel=new result_recherche_region_model();
		jt_regions=new JTable(rModel);
		jt_regions.getTableHeader().setReorderingAllowed(false);
		jt_regions.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		jt_regions.getSelectionModel().addListSelectionListener(this);
		dModel=new result_recherche_departement_model();
		jt_departements=new JTable(dModel);
		jt_departements.getTableHeader().setReorderingAllowed(false);
		jt_departements.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		jt_departements.getSelectionModel().addListSelectionListener(this);
		vModel=new result_recherche_ville_model();
		jt_villes=new JTable(vModel);
		jt_villes.getTableHeader().setReorderingAllowed(false);
		jt_villes.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		jt_villes.getSelectionModel().addListSelectionListener(this);
		qModel=new result_recherche_quartier_model();
		jt_quartiers=new JTable(qModel);
		jt_quartiers.getTableHeader().setReorderingAllowed(false);
		jt_quartiers.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		jt_quartiers.getSelectionModel().addListSelectionListener(this);
		JScrollPane jsp_pays=new JScrollPane(jt_pays);
		JScrollPane jsp_regions=new JScrollPane(jt_regions);
		JScrollPane jsp_departements=new JScrollPane(jt_departements);
		JScrollPane jsp_villes=new JScrollPane(jt_villes);
		JScrollPane jsp_quartiers=new JScrollPane(jt_quartiers);
		new_pays=new JButton("ajouter un pays");
		new_pays.addActionListener(this);
		new_region=new JButton("ajouter une région");
		new_region.addActionListener(this);
		new_departement=new JButton("ajouter un département");
		new_departement.addActionListener(this);
		new_ville=new JButton("ajouter une ville");
		new_ville.addActionListener(this);
		new_quartier=new JButton("ajouter un quartier");
		new_quartier.addActionListener(this);
		del_pays=new JButton("supprimer le pays");
		del_pays.addActionListener(this);
		del_region=new JButton("supprimer la région");
		del_region.addActionListener(this);
		del_departement=new JButton("supprimer le département");
		del_departement.addActionListener(this);
		del_ville=new JButton("supprimer la ville");
		del_ville.addActionListener(this);
		del_quartier=new JButton("supprimer le quartier");
		del_quartier.addActionListener(this);
		edit_pays=new JButton("éditer le pays");
		edit_pays.addActionListener(this);
		edit_region=new JButton("éditer la region");
		edit_region.addActionListener(this);
		edit_departement=new JButton("éditer le département");
		edit_departement.addActionListener(this);
		edit_ville=new JButton("éditer la ville");
		edit_ville.addActionListener(this);
		edit_quartier=new JButton("éditer le quartier");
		edit_quartier.addActionListener(this);


		//placer les objets
		pan.add(jsp_pays);
		jsp_pays.setBounds(10, 10, 190, 510);
		pan.add(jsp_regions);
		jsp_regions.setBounds(210, 10, 190, 510);
		pan.add(jsp_departements);
		jsp_departements.setBounds(410, 10, 190, 510);
		pan.add(jsp_villes);
		jsp_villes.setBounds(610, 10, 190, 510);
		pan.add(jsp_quartiers);
		jsp_quartiers.setBounds(810, 10, 190, 510);
		pan.add(edit_pays);
		edit_pays.setBounds(10,530, 190, 20);
		pan.add(edit_region);
		edit_region.setBounds(210, 530, 190, 20);
		pan.add(edit_departement);
		edit_departement.setBounds(410, 530, 190, 20);
		pan.add(edit_ville);
		edit_ville.setBounds(610, 530, 190, 20);
		pan.add(edit_quartier);
		edit_quartier.setBounds(810, 530, 190, 20);
		pan.add(del_pays);
		del_pays.setBounds(10, 560, 190, 20);
		pan.add(del_region);
		del_region.setBounds(210, 560, 190, 20);
		pan.add(del_departement);
		del_departement.setBounds(410, 560, 190, 20);
		pan.add(del_ville);
		del_ville.setBounds(610, 560, 190, 20);
		pan.add(del_quartier);
		del_quartier.setBounds(810, 560, 190, 20);
		pan.add(new_pays);
		new_pays.setBounds(10,590, 190, 20);
		pan.add(new_region);
		new_region.setBounds(210, 590, 190, 20);
		pan.add(new_departement);
		new_departement.setBounds(410, 590, 190, 20);
		pan.add(new_ville);
		new_ville.setBounds(610, 590, 190, 20);
		pan.add(new_quartier);
		new_quartier.setBounds(810, 590, 190, 20);


		//action fermeture fenetre
		this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		this.addWindowListener(
				new WindowAdapter(){
					public void windowClosing(WindowEvent e){
						close();

					}
				}
				);
		//afficher la fenetre
		this.setVisible(true);
	}

	private void close(){
		this.parent.setVisible(true);
		this.dispose();
	}

	private void update_tabs(char c){
		if(c=='a')
		{
			pModel.setNewData(pDAO.findAll());
			jt_pays.setModel(pModel);
			jt_pays.revalidate();
			jt_pays.repaint();
			rModel.reset();
			jt_regions.setModel(rModel);
			jt_regions.revalidate();
			jt_regions.repaint();
			dModel.reset();
			jt_departements.revalidate();
			jt_departements.repaint();
			vModel.reset();
			jt_villes.revalidate();
			jt_villes.repaint();
			qModel.reset();
			jt_quartiers.revalidate();
			jt_quartiers.repaint();
		}		
		if(jt_pays.getSelectedRow()>=0 && c=='p')
		{
			liste_regions=rDAO.findByPays((int)pModel.getValueAt(jt_pays.getSelectedRow(), 1));
			rModel.setNewData(liste_regions);
			jt_regions.setModel(rModel);
			jt_regions.revalidate();
			jt_regions.repaint();
			dModel.reset();
			jt_departements.revalidate();
			jt_departements.repaint();
			vModel.reset();
			jt_villes.revalidate();
			jt_villes.repaint();
			qModel.reset();
			jt_quartiers.revalidate();
			jt_quartiers.repaint();
		}
		if(jt_regions.getSelectedRow()>=0 && c=='r')
		{
			liste_departements=dDAO.findByRegion((int)rModel.getValueAt(jt_regions.getSelectedRow(), 1));
			dModel.setNewData(liste_departements);
			jt_departements.setModel(dModel);
			jt_departements.revalidate();
			jt_departements.repaint();
			vModel.reset();
			jt_villes.revalidate();
			jt_villes.repaint();
			qModel.reset();
			jt_quartiers.revalidate();
			jt_quartiers.repaint();
		}
		if(jt_departements.getSelectedRow()>=0 && c=='d')
		{
			liste_villes=vDAO.findbyDepartement((int)dModel.getValueAt(jt_departements.getSelectedRow(), 1));
			vModel.setNewData(liste_villes);
			jt_villes.setModel(vModel);
			jt_villes.revalidate();
			jt_villes.repaint();
			qModel.reset();
			jt_quartiers.revalidate();
			jt_quartiers.repaint();
		}
		if(jt_villes.getSelectedRow()>=0 && c=='v')
		{
			liste_quartiers=qDAO.findByVille((int)vModel.getValueAt(jt_villes.getSelectedRow(), 1));
			qModel.setNewData(liste_quartiers);
			jt_quartiers.setModel(qModel);
			jt_quartiers.revalidate();
			jt_quartiers.repaint();
		}



	}

	@Override
	public void actionPerformed(ActionEvent e) {

		Object source=e.getSource();

		if(source==edit_pays)
		{
			if(jt_pays.getSelectedRow()<0 || (int)pModel.getValueAt(0, 1)==-1)
			{
				JOptionPane.showMessageDialog(this.getContentPane(), "aucun pays n'est séléctionné.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			new Edit_Pays(this,pDAO.find((int)pModel.getValueAt(jt_pays.getSelectedRow(), 1)));
		}
		if(source==edit_region)
		{
			if(jt_regions.getSelectedRow()<0 || (int)rModel.getValueAt(0, 1)==-1)
			{
				JOptionPane.showMessageDialog(this.getContentPane(), "aucune région n'est séléctionnée.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			new Edit_Region(this,rDAO.find((int)rModel.getValueAt(jt_regions.getSelectedRow(), 1)));
		}
		if(source==edit_departement)
		{
			if(jt_departements.getSelectedRow()<0 || (int)dModel.getValueAt(0, 1)==-1)
			{
				JOptionPane.showMessageDialog(this.getContentPane(), "aucun département n'est séléctionné.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			new Edit_Departement(this,dDAO.find((int)dModel.getValueAt(jt_departements.getSelectedRow(), 1)));
		}
		if(source==edit_ville)
		{
			if(jt_villes.getSelectedRow()<0 || (int)vModel.getValueAt(0, 1)==-1)
			{
				JOptionPane.showMessageDialog(this.getContentPane(), "aucune ville n'est séléctionnée.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			new Edit_Ville(this,vDAO.find((int)vModel.getValueAt(jt_villes.getSelectedRow(), 1)));
		}
		if(source==edit_quartier)
		{
			if(jt_quartiers.getSelectedRow()<0 || (int)qModel.getValueAt(0, 1)==-1)
			{
				JOptionPane.showMessageDialog(this.getContentPane(), "aucun quartier n'est séléctionné.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			new Edit_Quartier(this,qDAO.find((int)qModel.getValueAt(jt_quartiers.getSelectedRow(), 1)));
		}
		if(source==new_pays)
		{
			new Edit_Pays(this, new Pays(-1, "", "", 0));
		}
		if(source==new_region)
		{
			if(jt_pays.getSelectedRow()<0 || (int)pModel.getValueAt(0, 1)==-1)
			{
				JOptionPane.showMessageDialog(this.getContentPane(), "aucun pays n'est séléctionné.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			new Edit_Region(this,new Region(-1,pDAO.find((int)pModel.getValueAt(jt_pays.getSelectedRow(), 1)), ""));
		}
		if(source==new_departement)
		{
			if(jt_regions.getSelectedRow()<0 || (int)rModel.getValueAt(0, 1)==-1)
			{
				JOptionPane.showMessageDialog(this.getContentPane(), "aucune région n'est séléctionnée.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			new Edit_Departement(this, new Departement(-1,rDAO.find((int)rModel.getValueAt(jt_regions.getSelectedRow(), 1)), "", 0));
		}
		if(source==new_ville)
		{
			if(jt_departements.getSelectedRow()<0 || (int)dModel.getValueAt(0, 1)==-1)
			{
				JOptionPane.showMessageDialog(this.getContentPane(), "aucun département n'est séléctionné.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			new Edit_Ville(this, new Ville(-1, dDAO.find((int)dModel.getValueAt(jt_departements.getSelectedRow(), 1)), "", ""));
		}
		if(source==new_quartier)
		{
			if(jt_villes.getSelectedRow()<0 || (int)vModel.getValueAt(0, 1)==-1)
			{
				JOptionPane.showMessageDialog(this.getContentPane(), "aucune ville n'est séléctionnée.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			new Edit_Quartier(this, new Quartier(-1, vDAO.find((int)vModel.getValueAt(jt_villes.getSelectedRow(), 1)), ""));
		}
		if(source==del_pays)
		{
			if(jt_pays.getSelectedRow()<0 || (int)pModel.getValueAt(0, 1)==-1)
			{
				JOptionPane.showMessageDialog(this.getContentPane(), "aucun pays n'est séléctionné.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			new Del_Pays(this,pDAO.find((int)pModel.getValueAt(jt_pays.getSelectedRow(), 1)));
		}
		if(source==del_region)
		{
			if(jt_regions.getSelectedRow()<0 || (int)rModel.getValueAt(0, 1)==-1)
			{
				JOptionPane.showMessageDialog(this.getContentPane(), "aucune région n'est séléctionnée.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			new Del_Region(this,rDAO.find((int)rModel.getValueAt(jt_regions.getSelectedRow(), 1)));
		}
		if(source==del_departement)
		{
			if(jt_departements.getSelectedRow()<0 || (int)dModel.getValueAt(0, 1)==-1)
			{
				JOptionPane.showMessageDialog(this.getContentPane(), "aucun département n'est séléctionné.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			new Del_Departement(this,dDAO.find((int)dModel.getValueAt(jt_departements.getSelectedRow(), 1)));
		}
		if(source==del_ville)
		{
			if(jt_villes.getSelectedRow()<0 || (int)vModel.getValueAt(0, 1)==-1)
			{
				JOptionPane.showMessageDialog(this.getContentPane(), "aucune ville n'est séléctionnée.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			new Del_Ville(this,vDAO.find((int)vModel.getValueAt(jt_villes.getSelectedRow(), 1)));
		}
		if(source==del_quartier)
		{
			if(jt_quartiers.getSelectedRow()<0 || (int)qModel.getValueAt(0, 1)==-1)
			{
				JOptionPane.showMessageDialog(this.getContentPane(), "aucun quartier n'est séléctionné.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			new Del_Quartier(this,qDAO.find((int)qModel.getValueAt(jt_quartiers.getSelectedRow(), 1)));
		}
	}

	public void valueChanged( ListSelectionEvent e)
	{
		Object source = e.getSource();
		if(source == jt_pays.getSelectionModel()&& e.getFirstIndex() >= 0 )
		{
			update_tabs('p');
		}
		else if(source== jt_regions.getSelectionModel()&& e.getFirstIndex() >= 0)
		{
			update_tabs('r');
		}
		else if(source== jt_departements.getSelectionModel()&& e.getFirstIndex() >= 0)
		{
			update_tabs('d');
		}
		else if(source== jt_villes.getSelectionModel()&& e.getFirstIndex() >= 0)
		{
			update_tabs('v');
		}
		else if(source== jt_quartiers.getSelectionModel()&& e.getFirstIndex() >= 0)
		{

		}
	}

	@Override
	public void componentHidden(ComponentEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void componentMoved(ComponentEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void componentResized(ComponentEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void componentShown(ComponentEvent e) {
		update_tabs('a');
	}
}
